﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpModel.h"
#include "NdbDataSchema.h"

namespace gcmp
{
    class Vector2d;
    class IArc2d;  
    class ILine2d;
    class IEllipse2d;

    /// \brief 曲线点类型
    SERIALIZABLE_ENUM_CLASS(PointTypeOnCurve)
    {
        StartPoint = 0,    ///< 起点
        EndPoint,      ///< 终点
        MiddlePoint,   ///< 中间点（在圆弧上)
        CenterPoint,   ///< 中心点
        MajorAxisEndPoint,  ///< 长轴端点（椭圆）
        MinorAxisEndPoint,  ///< 短轴端点（椭圆）
    };

    /// \brief 曲线编辑工具类，通过修改特征点修改曲线，目前仅支持二维线段、二维圆弧、二维椭圆弧
    class GCMP_MODEL_EXPORT CurveEditUtils
    {
    public:
        /// \brief 通过修改特征点编辑修改二维直线段
        /// \param pLine2d 被修改的二维线段指针
        /// \param pointType 修改点的类型
        /// \param point2d   修改的新点
        /// \param errorMsg  返回修改失败信息
        /// \return true修改成功，否则修改失败，通过errorMessage获取失败信息
        static bool EditLine2dByPoint(ILine2d* pLine2d, PointTypeOnCurve pointType, const Vector2d& point2d, std::wstring& errorMessage);

        /// \brief 通过修改特征点编辑修改二维圆弧
        /// \param pArc2d 被修改的二维圆弧指针
        /// \param pointType 修改点的类型
        /// \param point2d   修改的新点
        /// \param errorMsg  返回修改失败信息
        /// \return true修改成功，否则修改失败，通过errorMessage获取失败信息
        static bool EditArc2dByPoint(IArc2d* pArc2d, PointTypeOnCurve pointType, const Vector2d& point2d, std::wstring& errorMessage);


        /// \brief 通过修改特征点编辑修改二维椭圆弧
        /// \param pEllipse2d 被修改的二维椭圆弧指针
        /// \param pointType 修改点的类型
        /// \param point2d   修改的新点
        /// \param errorMsg  返回修改失败信息
        /// \return true修改成功，否则修改失败，通过errorMessage获取失败信息
        static bool EditEllipse2dByPoint(IEllipse2d* pEllipse2d, PointTypeOnCurve pointType, const Vector2d& point2d, std::wstring& errorMessage);
    };
}

